﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ttlang.node
{
    public struct srcinfo
    {
        public int fileid;
        public int startline;
        public int startcol;
        public int endline;
        public int endcol;
    }

    //语法节点，不需要和AST一一对应，AST可能会啰嗦，过程中整理一下
    public enum NodeType
    {
        UNDEFINED = 0,

        CONST = 0x1000,//常量系列
        INT_BIN,//二进制值
        INT_HEX,//十六进制值
        INT,//十进制值，可能有负号
        FLOAT,//含有小数的值，可能有符号
        STRING,//字符串
        BOOL,

        EXPR = 0x2000,//注意自增表达式 在 ttlang中无返回值，不是expr
        //不允许 return ++i 也不允许 return i++
        EXPR_UNARY,
        EXPR_CALL,
        EXPR_NEW,
        EXPR_GROUP,
        EXPR_ARRAY,
        EXPR_MATH,//特指左右两值的表达式
        EXPR_3OP,//三元表达式
        EXPR_TEMPVAR,//临时变量引用
        EXPR_ARGVAR,//參數引用
        EXPR_NUMBER,
        EXPR_CAST,
        EXPR_STRING,
        EXPR_METHOD,
        EXPR_MEMBER,//成员访问 a.b
        EXPR_CONTAINER,//container 是指一个type或者namespace

        CODES = 0x3000,
        CODE_BLOCK,
        CODE_COMMENT,
        CODE_VALUEDEF,
        CODE_SET,
        CODE_SELFOP,
        CODE_IF,
        CODE_FOR,
        CODE_CALL,
        CODE_RETURN,

        //这部分貌似不需要建立在这个层级，modules直接就分掉了
        //NODE_DEFINES = 0x4000,//定义类

        //DEF_MODULE,//模块
        //DEF_NAMESPACE,//命名空间
        //DEF_GLOBAL_METHOD,//全局函数，不在class之中的
        //DEF_GLOBAL_VARS,//全局变量
        //DEF_CLASS,//类型
        //DEF_DELEGATE,//委托函数定义
        //DEF_STRUCT,
        //DEF_INTERFACE,
        //DEF_MEMBER_METHOD,//类中的函数
        //DEF_MEMBER_VARS,//
        //DEF_ATTRIBUTE,//修饰器
    }
    public interface Node
    {
        srcinfo srcinfo
        {
            get;
            set;
        }
        NodeType type
        {
            get;
        }
        //List<Node>? children = null;
        //public Node AddChild()
        //{
        //    if (children == null)
        //        children = new List<Node>();
        //    var n = new Node();
        //    children.Add(n);
        //    return n;
        //}
        void Dump(int deep);
    }


}
